package com.tth.learn.addproperties.java;

import org.junit.Test;

import java.io.*;

/**
 * 缓冲流的使用
 * 1.缓冲流：
 *  BufferedInputStream
 *  BufferedOutputStream
 *  BufferReader
 *  BufferWriter
 *
 * 2.作用：提高流的读取、写入速度
 *
 * 3.原理：内部提供了一个缓冲区
 *
 * 4.处理流，就是“套接”在已有的流的基础上
 *
 * @Author tth
 * @Date 2022/12/26 11:10
 */
public class BufferedTest {

    /**
     * 使用BufferedInputStream和BufferedOutputStream实现图片的复制
     */
    @Test
    public void bufferedStreamTest() {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            // 1.实例化File，指明读取、写出的文件
            File srcFile = new File("image.png");
            File destFile = new File("image3.png");

            // 2.造流
            // 2.1 造节点流
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            // 2.2 造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            // 3.复制
            byte[] buff = new byte[10];
            int len;
            while ((len = bis.read(buff)) != -1) {
                bos.write(buff, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.资源关闭
            // 关闭原则：先关外层的流，再关内层的流。
            // 说明：在关闭外层流的同时，内层的流也会自动关闭。因此内层流的关闭操作，可以省略
            if (null != bos) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
//            fos.close();
//            fis.close();

        }

    }

    /**
     * 使用BufferedReader和BufferedWriter实现文本文件的复制
     */
    @Test
    public void bufferedReaderWriterTest() {
        BufferedReader br = null;
        BufferedWriter bw = null;

        try {
            // 1.造流
            br = new BufferedReader(new FileReader("error.log"));
            bw = new BufferedWriter(new FileWriter(new File("error1.log")));

            // 2.复制
//            方法一：使用read
//            char[] cbuff = new char[1024];
//            int len;
//            while ((len = br.read(cbuff)) != -1) {
//                bw.write(cbuff, 0, len);
//            }

            // 方法二：使用readLine()：一次读取一行，不包括换行符。读到文件末尾，返回null
            String data;
            while (null != (data = br.readLine())) {
                bw.write(data);
                bw.newLine();//换行
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3.关闭流
            if (null != bw) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
